本节内容

1、概述

2、什么是进程?

3、什么是线程?

4、什么是携程?

5、存在的疑问

6、总结

一、概述

  我们知道,所有的指令的操作都是有CPU来负责的,cpu是来负责运算的。OS(操作系统) 调度cpu的最小单位就是线程。程序启动后,从内存中分一块空间,把数据临时存在内存中,因为内存比较快,内存比磁盘快,而CPU又比内存还要快很多。进程之前的的内存是不能访问的,默认是要隔离的。每一个程序的内存是独立的,互相是不能访问的。

  进程:是以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理,网络接口的调用等等。。。。对各种资源管理的集合,就可以成为进程。

  线程:是操作系统的最小的调度单位,是遗传指令的集合。

二、什么是进程(Process)?

2.1、英文解释

An executing instance of a program is called a process.

每个程序执行的实例被称为进程。

Each process provides the resources needed to execute a program. A process has a virtual address space, executable code, open handles to system objects, a security context, a unique process identifier,

每个进程提供提供此程序的所需要的资源。一个进程有一个虚拟地址空间,执行代码,操作系统的系统接口,一个安全的上线文,一个唯一的进程标识符(PID),

environment variables, a priority class, minimum and maximum working set sizes, and at least one thread of execution. Each process is started with a single thread, often called the primary thread, but can

环境变量,一个优先级类,设置最大和最小的工作空间大小,和至少一个线程在运行。每个进程开始一单个线程,通常陈为主线程,但是能创建多个子线程。

create additional threads from any of its threads.

2.2、进程概念

程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。

在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。这是这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。

2.3、有了进程为什么还要线程?

进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上:

  • 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。

  • 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。

例如,我们在使用qq聊天, qq做为一个独立进程如果同一时间只能干一件事,那他如何实现在同一时刻 即能监听键盘输入、又能监听其它人给你发的消息、同时还能把别人发的消息显示在屏幕上呢?你会说,操作系统不是有分时么?但我的亲,分时是指在不同进程间的分时呀, 即操作系统处理一会你的qq任务,又切换到word文档任务上了,每个cpu时间片分给你的qq程序时,你的qq还是只能同时干一件事呀。

再直白一点, 一个操作系统就像是一个工厂,工厂里面有很多个生产车间,不同的车间生产不同的产品,每个车间就相当于一个进程,且你的工厂又穷,供电不足,同一时间只能给一个车间供电,为了能让所有车间都能同时生产,你的工厂的电工只能给不同的车间分时供电,但是轮到你的qq车间时,发现只有一个干活的工人,结果生产效率极低,为了解决这个问题,应该怎么办呢?。。。。没错,你肯定想到了,就是多加几个工人,让几个人工人并行工作,这每个工人,就是线程!

三、什么是线程(Thead) ?

3.1、线程概念

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

3.2、英文解释

A thread(线程) is an execution(执行) context(上下文), which is all the information a CPU needs to execute a stream of instructions.(线程就是cpu执行时所需要的上下文信息指令)

Suppose(假设) you're reading a book, and you want to take a break right now, but you want to be able to come back and resume(恢复) reading from the exact point where you stopped. One way to achieve that is by jotting down(记录下来) the page number, line number, and word number. So your execution context for reading a book is these 3 numbers.

If you have a roommate(室友), and she's using the same technique, she can take the book while you're not using it, and resume reading from where she stopped. Then you can take it back, and resume it from where you were.

Threads work in the same way. A CPU is giving you the illusion(幻觉) that it's doing multiple(多) computations(运算) at the same time. It does that by spending(花费) a bit of time on each computation. It can do that because it has an execution context for each computation. Just like you can share a book with your friend, many tasks can share a CPU.

On a more technical level, an execution context (therefore a thread)(一个上线文的切换就是一个线程)  consists(组合) of the values of the CPU's registers(寄存器).

Last: threads are different from processes(线程不同于进程). A thread is a context of execution(线程是一段上下文的执行指令), while a process is a bunch(一簇) of resources(资源) associated(相关的) with a computation. A process can have one or many threads.

Clarification(澄清一下): the resources associated with a process include memory pages (all the threads in a process have the same view of the memory(所有在同一个进程里的线程是共享同一块内存空间)), file descriptors (e.g., open sockets), and security credentials (e.g., the ID of the user who started the process).

四、进程与线程的区别?

4.1、英文解释

  1. Threads share the address space of the process that created it; processes have their own address space.
  2. Threads have direct access to the data segment of its process; processes have their own copy of the data segment of the parent process.
  3. Threads can directly communicate with other threads of its process; processes must use interprocess communication to communicate with sibling processes.
  4. New threads are easily created; new processes require duplication(克隆、复制) of the parent process.
  5. Threads can exercise considerable control over threads of the same process; processes can only exercise control over child processes.
  6. Changes to the main thread (cancellation(取消), priority change(优先级的改变), etc.) may affect the behavior of the other threads of the process; changes to the parent process does not affect child processes.

4.2、中文解释

  1. 线程是共享内存空间的;进程的内存是独立的。
  2. 线程可以直接访问此进程中的数据部分;进程有他们独立拷贝自己父进程的数据部分,每个进程是独立的
  3. 同一进程的线程之间直接交流(直接交流涉及到数据共享,信息传递);两个进程想通信,必须通过一个中间代理来实现。
  4. 创建一个新的线程很容易;创建新的进程需要对其父进程进行一次克隆。
  5. 一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程。
  6. 对主线程的修改,可能会影响到进程中其他线程的修改;对于一个父进程的修改不会影响其他子进程(只要不删除父进程即可)

五、存在的疑问

5.1、进程和线程那个运行快?

注意了,它俩是没有可比性的,线程是寄生在进程中的,你问它俩谁快。说白了,就是问在问两个线程谁快。因为进程只是资源的集合,进程也是要起一个线程的,它俩没有可比性。

5.2、进程和线程那个启动快?

答案是:线程快。因为进程相当于在修一个屋子。线程只是一下把一个来过来就行了。进程是一堆资源的集合。它要去内存里面申请空间,它要各种各样的东西去跟OS去申请。但是启动起来一运行,它俩是一样的,因为进程也是通过线程来运行的。

六、总结

  1. 线程是操作系统最小的调度单位,是一串指令的集合。
  2. 进程要操作CPU,必须先创建一个线程。
  3. 进程本身是不可以执行的,操作cpu是通过线程实现的,因为它是一堆执行,而进程是不具备执行概念的。就像一个屋子,屋子就是进程,但是屋子里面的每一个人就是线程,屋子就是内存空间。
  4. 单核CPU只能同时干一件事,但是为什么给我们的感觉是在干了很多件事?因为上线的切换,刚才也说了跟读书那个例子一样。因为CPU太快了,可以有N多次切换,其实它都是在排着队呐。
  5. 寄存器是存上下文关系的。
  6. 进程是通过PID来区分的,并不是通过进程名来区分的。进程里面的第一个线程就是主线程,父线程和子线程是相互独立的,只是父线程创建了子线程,父线程down了,子线程不会受到影响的。
  7. 主线程修改影响其他线程的行文,因为它们是共享数据的。

网络编程基础【day10】:进程与线程介绍(一 )的更多相关文章

  1. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  2. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

  3. Java多线程基础:进程和线程之由来

    转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...

  4. 服务器编程入门(4)Linux网络编程基础API

      问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字( ...

  5. 用Netty开发中间件:网络编程基础

    用Netty开发中间件:网络编程基础 <Netty权威指南>在网上的评价不是很高,尤其是第一版,第二版能稍好些?入手后快速翻看了大半本,不免还是想对<Netty权威指南(第二版)&g ...

  6. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...

  7. 【网络编程1】网络编程基础-TCP、UDP编程

    网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...

  8. python全栈开发从入门到放弃之socket网络编程基础

    网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...

  9. 1、Java多线程基础:进程和线程之由来

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

  10. Linux网络编程基础API

    第5章 Linux网络编程基础API 探讨Linux网络编程基础API与内核中TCP/IP协议族之间的关系,并未后续章节提供编程基础.从3个方面讨论Linux网络API. socket地址API.so ...

随机推荐

  1. Pearls POJ - 1260 dp

    题意:有n种不同的珍珠 每种珍珠的价格不同  现在给出一个采购单 标注了需要不同等级的珍珠和相对于的个数(输入按价格升序排列) 其中 价格为   (当前种类价格+10)*购买数量  这样就有一种诡异的 ...

  2. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  3. atcoder NIKKEI Programming Contest 2019 E - Weights on Vertices and Edges

    题目链接:Weights on Vertices and Edges 题目大意:有一个\(n\)个点\(m\)条边的无向图,点有点权,边有边权,问至少删去多少条边使得对于剩下的每一条边,它所在的联通块 ...

  4. 脚本自动封掉并发数过高的 IP

    防止扫描器对服务器恶意扫描,可以对 iptables 规则做了比较严格的配置. 以下配置可作为参考: #lo -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j A ...

  5. Codeforces Bubble Cup 11 J. Moonwalk challenge加强版

    题意 有一棵 \(n\) 个节点的树,每条边上有一个字符,有 \(m\) 次询问. 每次会选定两个点 \(u, v\) , \(u\) 到 \(v\) 的路径上的字符形成了一个字符串 \(T\) ,再 ...

  6. Android工程图片资源命名禁忌

    Android工程中,res\drawable\ 文件夹下所有的图片资源文件命名,不允许: 1. 大写字母 从Eclipse的这个报错可以知道资源文件的命名规则. Invalid file name: ...

  7. Mysql数据库操作笔记

     如果数据库表字段存在,则删除该表 drop table if exists `table_name` 创建数据库表语句 create table `table_name`( `id` ) not n ...

  8. luogu3233 世界树 (虚树)

    反正肯定要建虚树,考虑建完之后怎么做 先随便dp一下算出来距离某点最近的询问点mi[x](因为有的虚树上的点它不是询问点嘛) 那我们对于某条链x到fa[x]上的非虚树上的点(包括他们的非虚树上的孩子) ...

  9. [nowcoderACM_223C][区区区间间间]

    题目链接 思路 考虑用单调栈,栈顶为最大元素.当得到一个新值得时候,将这个值宇栈顶比较.因为栈顶是前面的最大元素.所以只要当前元素比栈顶大,那么肯定比前面的都大.只要将这个元素乘上前面的个数就行了. ...

  10. 利用sqlalchemy读取数据库 和pandas的Dataframe对象 互相生成

    #导入pandas import pandas as pd import numpy as np #导入SqlAlchemy from sqlalchemy import create_engine ...