进程线程等操作系统基础知识

Posted Linux bsping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程线程等操作系统基础知识相关的知识,希望对你有一定的参考价值。

        今天在班级群里面水群时出现了一个严重的错误,然后就和老师发生了较为激烈的辩论,最后却发现我和老师的观点根本就不是针对同一个问题的,而我确实有一个知识点错了,收获很大,下面我也会提出这个知识点。平时和老师有不一样的观点就大胆提出来,错了就改,知识点还能记得更加熟练,而且指不定老师也是错的呢(狗头保护)。下面来记录一下操作系统复习的情况。

一、进程与线程的差别

1、进程是程序的一次执行,线程可以理解为进程中执行的一段程序片段。举例就是PPT,进程就相当于是PPT,而PPT里面的功能就相当于是线程完成的。

2、进程是独立的(这里指上下文环境,内存空间),线程运行在进程空间中,进程不可以跨越进程的空间去访问其它进程,但线程存在于进程中,所以同一进程所产生的线程共享一定内存空间。

3、同一进程中的两段代码不可以同时进行,除非引入线程。

4、线程属于进程,当进程退出后,所有的线程都会被强制退出并清除。

5、线程占用的资源要少于进程所占用的资源,进程和线程都具有优先级。

二、引入线程的优点

1、比进程易于调度。

2、提高并发性,通过线程可以方便、有效的实现并发。

3、开销小,创建一个线程比创建进程快,所要的开销小,都在进程内,切换快速。

4、有利于发挥多处理器的功能使每个线程都可以在一个处理器上运行。

三、线程同步机制

线程可以通过临界区、信号量、互斥量、事件等来实现同步。

1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。它并不是核心对象,不是属于操作系统维护的,而是属于进程维护的。总结下关键段:
        1)关键段共初始化化、销毁、进入和离开关键区域四个函数。
        2)关键段可以解决线程的互斥问题,但因为具有“线程所有权”,所以无法解决同步问题。
        3)推荐关键段与旋转锁配合使用。

2、互斥对象:互斥对象和临界区很像,采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程同时访问。当前拥有互斥对象的线程处理完任务后必须将线程交出,以便其他线程访问该资源。总结下互斥量Mutex:
        1)互斥量是内核对象,它与关键段都有“线程所有权”所以不能用于线程的同步。
        2)互斥量能够用于多个进程之间线程互斥问题,并且能完美的解决某进程意外终止所造成的“遗弃”问题。
3、信号量:信号量也是内核对象。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目

在用CreateSemaphore()创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最 大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1 ,只要当前可用资源计数是大于0 的,就可以发出信号量信号。但是当前可用计数减小 到0 时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。线程在处理完共享资源后,应在离 开的同时将当前可用资源计数加1 。在任何时候当前可用资源计数决不可能大于最大资源计数。

4、事件对象: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作

总结下事件Event
        1)事件是内核对象,事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。
        2)事件可以由SetEvent()来触发,由ResetEvent()来设成未触发。还可以由PulseEvent()来发出一个事件脉冲。
        3)事件可以解决线程间同步问题,因此也能解决互斥问题。

四、实现进程通信的机制

1、管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

2、命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
3、消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

4、共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
5、信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

6、套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
7、信号  : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

五、cache在OS与CPU中的作用

1、OS中

        操作系统中,为了提高系统的存取速度,在地址映射机制中增加了一个小容量的寄存器,即快表,用来存放当前访问次数最频繁的少数活动页面的页号。当某用户需要存取数据时,根据数据所在的逻辑页号在快表中找到对应的内存块好,再联系页内地址形成物理地址。快表中若无逻辑页号,则将其放入快表的空闲块中。如果快表满了,则根据所采用的页面淘汰算法加入新的页号。

2、CPU中

        CPU的运行速度越来越快,发展飞速,但是主存的结构和存取速度改进的却很慢,因此高速C缓存技术越来越重要,Cache高速存储器是位于CPU与内存之间的临时存储器,他的容量小但是存取速度很快。速度快,但是容量小,所以在CPU调用大量数据时,要避开Cache直接访问内存。CPU引入Cache是一种很高效的解决方案,这样Cache+内存就变成了一个存取速度快、且内存大的存储系统了。Cache对CPU的影响很大,这主要是由CPU的数据交换顺序和Cache与CPU之间的带宽引起的。

六、产生死锁的四个必要条件--缺一都不可形成死锁

1、互斥条件:一个资源每次只能被一个进程使用。

2、请求与保持条件:进程因为请求资源而阻塞,对已有的资源保持不放。

3、不可剥夺条件:进程已经获得的资源,在未使用前,不能强行剥夺。

4.循环等待条件:若干个进程形成一种首尾相接的循环等待资源关系。

七、避免死锁--死锁的解除和预防

1、采用资源静态分配,资源一次性分配完毕,破坏请求与保持条件。

2、允许进程剥夺,破坏不可剥夺条件。

3,、采用资源有序分配,破坏环路等待条件。

因为互斥条件无法避免,因为资源就是要互斥访问。

八、用户线程和内核线程的区别

根据操作系统对线程是否可以感知,将线程分为内核线程与用户线程。内核线程的活动都是内核操作完成的,而用户线程的操作都是利用线程库来调用完成的。

九、用户线程与内核线程的优点与缺点

优点:

1、可以在不支持线程的操作系统下实现线程。

2、用户线程的代建比内核线程小。

3、用户线程可以利用的空间比内核线程多。

4、允许自己定制调度算法。

缺点:

1、一个线程阻塞则会导致整个进程阻塞。

2、页面失效也会导致进程挂起

内核线程与用户线程相反。

十、库函数与系统调用的区别

库函数:他是应用程序的一部分,他是高层的、运行在用户空间。

系统调用:系统调用是内核提供给应用程序的接口,属于操作系统的一部分。

系统调用需要切换至内核态,所以慢一些。

十一、虚拟内存即其优缺点

        虚拟内存使程序认为自己有连续可用的内存,允许程序员编写并执行比实际系统大的多的程序,这使得可以在有限的空间内完成更大的应用程序。

优点:

1、扩大了地址内存,寻址空间比实际大很多。

2、内存保护。

3、公平分配。

4、进程需要通信时,采用虚拟共享即可。

缺点:

1、虚拟管理更麻烦。

2、有些数据在磁盘中,页面置换时需要访问磁盘,很慢。

3、从虚拟存储地址到物理地址需要转化。

4、如果一页只有一小部分内容,浪费内存。

十二、常用的页面置换算法

1.先进先出FIFO

2、最近最久未使用LRU

3、最佳置换算法OPT

4、时钟置换算法CLOCK

十三、静态链接与动态链接

静态链接:将调用的函数直接复制到可执行文件中,成为.exe文件的一部分。

动态链接:将函数的可定位信息保存到可执行文件中,程序运行时操作系统将动态链接库.dll与应用程序链接起来,要调用那个函数根据定位信息在.dll库中执行。

#静态链接可移植性高,放到其他电脑可以直接运行。动态链接需要将动态链接库也移植过去,程序才可以正确执行。

十四、进程、线程的资源

进程分配的资源:

标识相关:pid,ppid等等
文件相关:进程需要记录打开的文件信息,于是需要文件描述符表
内存相关:内存指针,指向进程的虚拟地址空间(用户空间)信息
优先级相关:进程相对于其他进程的调度优先级
上下文信息相关:CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
状态相关:进程当前的状态,说明该进程处于什么状态
信号相关:进程的信号处理函数,以及记录当前进程是否还有待处理的信号
I/O相关:记录进程与各种I/O设备之间的交互
 

线程共享的资源包括:

(1) 进程代码段

(2) 进程的公有数据(利用这些数据,线程很容易实现相互之间的通讯)

(3) 进程的所拥有资源。

线程独立的资源包括:

(1)线程ID:每个线程都有自己唯一的ID,用于区分不同的线程。

(2)寄存器组的值:当线程切换时,必须将原有的线程的寄存器集合的状态保存,以便重新切换时得以恢复。

(3)线程的堆栈:堆栈是保证线程独立运行所必须的。

(4)错误返回码:由于同一个进程中有很多个线程同时运行,可能某个线程进行系统调用后设置了error值,而在该线程还没有处理这个错误,另外一个线程就在此时被调度器投入运行,这样错误值就有可能被修改。所以,不同的线程应该拥有自己的错误返回码变量。

(5)线程优先级:线程调度的次序(并不是优先级大的一定会先执行,优先级大只是最先执行的机会大)。

十五、下面是和老师讨论的一些重点知识

        1、并发和并行

        并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

        并行:是同一时刻多个任务同时进行。

        2、任务、线程、进程

        现代操作系统中,任务就是线程,线程就是处理相应的数据结构,数据结构就是数据,剩下就是设计算法来处理数据。(这句话高度抽象,数据结构里其实都是保存的数据,所以程序设计=算法+数据结构) 进程是资源分配的最小单位。线程是调度的最小单位。进程是程序的动态执行,但是相对于线程,进程又是静止的,线程是操作系统调度的最小单位,所以是动态的。在操作系统的眼中任务是可以调度执行的,所以此时的任务其实就是一个线程。

        3、平时所用的cortex-m3类型的单片机都是单核,只能实现单核多线程,他的多线程其实也是并发实现的,就如并行和并发那张图一样。

以上是关于进程线程等操作系统基础知识的主要内容,如果未能解决你的问题,请参考以下文章

java核心技术-多线程之线程基础

进程,线程,协程,异步IO知识点

Java线程知识拾遗

信管备考知识点精讲·操作系统之进程与线程

多线程基础

java核心-多线程-线程类基础知识