网站怎么优化,网站开发用什么框架合适,计算机网站建设专业热门吗,自学网站平面设计文章目录 进程线程进程与线程比较 进程
什么是进程#xff1f; 概念上来说#xff0c;进程是担当OS资源分配的实体。通俗来说#xff0c;进程是我们OS上一个在运行的程序。 我们的OS上不止有一个进程#xff0c;当我们的某一个进程像是去磁盘上读文件时#xff0c;由于磁… 文章目录 进程线程进程与线程比较 进程
什么是进程 概念上来说进程是担当OS资源分配的实体。通俗来说进程是我们OS上一个在运行的程序。 我们的OS上不止有一个进程当我们的某一个进程像是去磁盘上读文件时由于磁盘的速度很慢这是为了提高CPU的利用率这时就会将该进程挂起而去执行另一个进程直到磁盘读写完毕给OS一个信号OS从而在去调度原来被挂起的进程。 进程不止有一个所以就需要我们对进程进行管理怎么管理先描述后组织将进程的属性抽象成结构体然后将每个进程的结构体通过链表组织起来。其中所谓 的结构体就是我们的PCB—进程控制模块在Linux中就是我们的task_struct。每一个进程都有其独立的PCB那么操作系统对进程的管理就变为了实际上对PCB进行管理。PCB放在哪个组织结构里实则对应着的是其不同的进程状态我们的进程至少具备三种基本状态运行状态就绪状态阻塞状态。其分别对应着运行队列就绪队列阻塞队列这样的组织结构。 运行状态正在运行的进程 就绪状态随时可以运行但CPU正在被其他进程所占有 阻塞状态由于等待输入输出等时间无法运行及时给它CUP控制权也无法运行。 若有大量的阻塞状态回导致我们的内存利用率不高所以通常会把阻塞状态的进程的物理内存换入到磁盘中只留有其内核数据在内存中当需要再运行的时候再从磁盘中写回我们将这种状态成为挂起状态。 task_struct中有什么 标示符: 描述本进程的唯一标示符用来区别其他进程。 状态: 任务状态退出代码退出信号等。 优先级: 相对于其他进程的优先级。 程序计数器: 程序中即将被执行的下一条指令的地址。 内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针 上下文数据: 进程执行时处理器的寄存器中的数据。 IO状态信息: 包括显示的I/O请求,分配给进程的IO设备和被进程使用的文件列表。 记账信息: 可能包括处理器时间总和使用的时钟数总和时间限制记账号等。 其他信息 那我们的进程都要是处于就绪状态OS该如何决策调度哪一个进程呢这就是是OS调度器要干的事情啦我们可以在可以简单的说名以下每个进程都有优先级优先级越高则越是容易被调度当然这个优先级的计算是调度器帮我们去评判的那么我们人为的可以干预吗是可以的我们的nice值就可以帮助我们进行优先级的干预。 PRI是进程的优先级其表示该进程被cpu执行的先后顺序其值越小优先级越高。 那么NI是啥呢可以将其理解为优先级的修正数值。 因此调整nice值就是调整进程的优先级。nice值的取值范围是-19 - 20。 那么如何更改nice值 可以使用top命令进行修改。其使用格式如下 进入top后按“r”–输入进程PID–输入nice值。 调整已存在进程的nicerenice 我们的每个进程都拥有其独立的进程地址空间以及页表。这样的设计使得我们多进程得以实现避免了直接对物理内存操作而引起地址冲突再者由于虚拟地址到物理地址之间要经过映射并且我们对进程地址空间进行了分段因此在映射时我们自然就可以进行一些检查检查其访问的地址是否安全以及该地址所存储数据的属性是否允许我们进行操作等进程地址空间使得让每一个进程都觉得自己拥有整个内存它不关心其他的进程这也是进程独立的体现并且由于有局部性原理我们可以将一些暂时不用的其他进程所占用的内存换出到磁盘中从而给当前进程用提高了内存的使用效率。 我们可以在当前进程中利用fork函数创建子进程我们的进程具有独立性创建的子进程通过拷贝父进程的PCB再更具自己的情况稍加更改就成了自己的PCB结构体因此在父进程在创建子进程前的一些属性和数据例如文件描述符表等子进程都是可以看见的。当然子进程也会创建出自己的进程地址空间。只不过为了提高效率节约内存其采用读时共享写时拷贝的策略在读时和父进程映射同一块物理内存只有写时才会重新将数据映射到心的物理内存上。 新创建出来的子进程若我们不进行等待就会形成僵尸进程僵尸进程会占用一定的资源我们的子进程在退出时其会保留一些退出信息当然由于进程并未完全退出所以其PCB当然也存在在内核中所以为了减少资源的浪费我们要对子进程进行回收回收可以采用父进程阻塞式的等待父进程进行轮询判断等方式进行回收还可以通过信号的方式因为我们的子进程在退出时会像父进程发送SIGCHILD信号所以我们若不关心退出信息可以通过显式的忽略该信号特例关心的话可以在自定义信号处理函数中进行等待循还非阻塞式等待。 我们在的进程还可以进行替换利用execv函数族进行进程替换其本质就是将该进程的代码和数据进行替换PCB等结构不变。 进程终止我们可以通过exit函数信号直接return等方式进行退出。
线程
什么叫线程 线程是OS进行调度运行的最小单位线程运行在进程的内部是进程实际运行的单位。进程是承担OS资源的实体那么线程就是承担进程部分资源的一个实体。 在一个进程内部不止有一个进程那么我们是不是要对其进行管理先描述后组织将其属性抽象从某种结构体我们将这种结构体成为TCB。也就是说OS实际调度的是一个个TCB当然这是对于一般OS来说。Linux有自己的方案。 Linux认为既然线程的结构和进程类似那么我就不用去再实现线程的一套结构而是将一个线程当作一个特殊的进程来看待这样的优势则是减少了我们结构的复杂度从而降低了BUG的产生。 因此现在对于CPU而言其不管你是线程还是进程它所认的就是PCB结构体。 为了能够实现线程我们就要将原来进程的那一套进行一些更改。这就涉及到了线程的一些特性。我们的同一个进程的多个线程之间是能够共享代码段数据段打开的文件等资源的也就是说其要共享进程地址空间上的一些数据。这当然好办我们在创建这个特殊的进程时将其和创建它的进程的地址空间进行共享。 当然除了共享的数据以外每个线程都是一个执行流它也应该拥有自己的私有栈独立的上下文数据信号屏蔽字线程ID调度优先级等。后面的一些数据由于线程有独立的PCB因此可以私有化但是栈怎么办用户栈只有一个要是都放在用户栈里岂不是太过于混乱。Linux的解决办法是这样的此时我们的线程对于上层用户来说操作是有难度的所以有第三方库经过对Linux 的线程接口封装为我们提供了使用Linux线程更方便的方法在使用线程时程序运行起来后会将第三方库加载到我们的mmp共享区域这个库不光为我们解决了使用线程系统调用接口难的问题还帮我们提供了线程所使用的栈。这个栈在哪呢就在我们的mmp中并且我们的线程id就是其栈的起始地址而我们ps -aL中显式的LWP则是内核中标记线程的id。它与我们用户所看到的线程id是一一对应的。 所以Linux下的进程其他OS下的进程。OS下的进程我们称为轻量级进程。
进程与线程比较
进程承担OS资源分配的实体而线程是CPU的基本调度单位线程在进程中。 线程之间大多数资源是共享的所以线程间通信方便而进程是独立的所以进程间通信难度较大。 线程能够减少并发执行的时间和空间开销-----体现在 线程的创建更加简单。 线程进行切换时效率更快。因为我们在进行切换时不仅仅是将PCB换下去保存上下文我们的计算机为了更快的效率在CPU和内存之间还由多级缓存我们的线程中的资源好多都是共享的所以缓存命中率高而进程切换则需要重新加载缓存。 线程的释放也要比进程快。 但是我们同一进程内的线程异常退出那么我们整个进程也都退出了而且线程由于一些数据共享的问题会带来线程安全。