操作系统
文章平均质量分 75
CC_YXK
这个作者很懒,什么都没留下…
展开
-
通过硬件的支持实现互斥
一、中断禁用 单处理机:在单处理机中,并发进程不能重叠,只能交替,操作系统通过中断来实现进程的交替,那么就会存在一个问题,当一个进程A运行到临界区时发生了中断,另一个进程B运行,进程B也可以运行临界区代码,这样就改变了临界资源,当进程A再接着中断的位置运行时相关数据有可能已经被进程B修改,出现错误。 这个问题可以通过禁用中断来解决,禁用中断和启用中断都是原语操作。通过这个方法...原创 2018-09-27 09:52:21 · 2509 阅读 · 0 评论 -
互斥和同步
互斥:是指散布在不同进程之间的若干程序片段,当某个进程执行其中的一个程序片段时,其他进程就不能运行它们之中的任一程序片段,只能等到该进程运行完之后才可以继续运行。同步:是指散布在不同进程之间的若干程序片段,它们的运行必须严格按照一定的先后次序来运行,这种次序依赖于要完成的任务。比如数据的收发,必须发送方发送了接收方才能收。 同步是一种更为复杂的互斥吗,而互斥是一种特殊的同步。...原创 2019-03-10 12:43:22 · 12192 阅读 · 1 评论 -
信号量和互斥锁的区别
信号量是用在多线程多任务同步的,互斥锁是用在多线程多任务互斥的信号量可以做到一个线程完成了某个动作就通过信号量告诉别的线程,别的线程再进行某些动作。互斥锁是指一个线程使用某个资源通过对其加锁而使得其他线程无法访问,直到这个线程解锁,其他线程才可以继续访问。...原创 2019-03-10 13:25:15 · 1622 阅读 · 1 评论 -
进程、线程和协程
进程:进程就是应用程序的启动实例,比如我们打开一个游戏、运行一个软件,就是开启了一个进程。进程拥有代码和打开的文件资源、数据资源、独立的内存空间。线程:线程从属于进程,是程序的实际执行者。一个进程至少包含一个线程,也可以拥有更多的线程,线程拥有自己的栈空间。协程:协程的出现是为了解决进程和线程存在的问题的。使用多进程和多线程往往效率往往都不高(多线程比多进程效率高),因为在同步时会不可...原创 2019-03-20 15:22:31 · 205 阅读 · 0 评论 -
线程池
什么是线程池 线程池就是提前创建一些线程,它们的集合叫做线程池。程序会将任务交给线程池,线程池会分配一个空闲的线程取执行任务,等待任务执行完成之后,该线程不会被销毁,而是重新还给线程池。这样减少了大量的线程创建销毁的操作,提高了程序的执行效率。线程池的工作原理在有任务要执行时,不用想内核去申请创建线程,而是将任务交给线程池,线程池分配一个空闲的线程取执行任务在任务执行完毕...原创 2019-03-20 15:38:45 · 153 阅读 · 0 评论 -
堆和栈的区别
栈:栈区空间由操作系统分配与释放,用于存储局部变量、函数参数等。函数种定义的变量按定义的先后顺序入栈,其操作方式类似于操作系统中的栈。栈的内部地址是由高到低分配的,因此后定义的变量在栈中的地址低于先定义的变量。堆:堆区的空间由程序员自主分配与释放,程序员没有主动释放则在程序结束时由操作系统回收。堆区的内部地址生长方向与栈相反,由低到高。1、管理方式不同栈区空间操作系统自动分配释放 堆...原创 2019-03-13 14:22:55 · 329 阅读 · 0 评论 -
内核栈和用户栈
内核在创建进程的时候创建进程控制块以及进程的堆栈。每个进程有两个栈:用户栈、内核栈用户栈在用户地址空间中,内核栈在内核地址空间中。用户栈 用户栈不难理解,用户栈是用户空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值以及局部变量等信息。在linux系统中,用户栈的大小一般为8M。可以通过ulimit -s来手动设置。进程用户栈和内核栈的切换 ...原创 2019-03-13 15:50:14 · 11816 阅读 · 9 评论 -
栈溢出
在想搞明白栈溢出之前,我们先弄清楚另外一件事:函数调用栈的过程函数调用栈过程用ebx寄存器和esx寄存器来表示一个函数栈帧,ebx表示栈底指针、esx表示栈顶指针。函数调用栈的过程如下:开辟栈帧函数参数入栈:参数入栈的顺序是从右向左,当参数小于8个字节的时候用寄存器记录参数值,并将寄存器中的值入栈;当参数大于8个字节的时候,首先将主调函数的栈顶指针向上移动参数大小的位置,然后将参数...原创 2019-03-13 20:46:28 · 227 阅读 · 0 评论 -
多进程和多线程
在介绍多进程和多线程之前,首先搞清楚一个问题,多进程和多线程解决的是什么问题?或者说为什么需要多进程和多线程?1、并发 对于一个程序,如果只有一条执行路径,那么效率将会是非常低的,一个程序往往有多个部分组成,每个模块执行不同的任务,如果让这些任务同时执行,各自完成自己的任务,将会使效率得到大大的提升。2、多进程 进程是一个正在执行的程序。对于并发执行,那就不可...原创 2019-03-18 22:37:45 · 155 阅读 · 0 评论 -
epoll详解——从功能到内核
首先我们了解以下什么是I/O复用。I/O就是指网络中的I/O(即输入输出),多路是指多个TCP连接,复用是指一个或少量线程被重复使用。连起来理解就是,用少量的线程来处理网络上大量的TCP连接中的I/O。常见的I/O复用有以下三种:select poll epoll为什么使用epoll?这个问题也可以理解为epoll相比于select和poll有什么缺点。首先我们来分析...原创 2019-03-09 21:55:24 · 381 阅读 · 0 评论 -
进程和线程的区别
进程:进程是一个正在运行的程序,进程是资源分配的最小单位线程:线程是程序执行的最小单位,一个进程可以由多个线程组成,多个线程共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由cpu独立调度执行,在多cpu下就允许多个线程同时运行。线程和进程之间的区别进程是资源分配的最小单位,线程是程序执行的最小单位 进程有自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据...原创 2019-03-06 21:53:32 · 206 阅读 · 0 评论 -
内存管理 --- 分页
内存管理最基本的操作是由处理器把程序装入内存中执行。在大部分现代多道程序设计系统中,这往往还涉及到一种称为虚拟内存的精密方案。虚拟内存又基于分段和分页这两种基本技术或其中的一种技术,以下介绍分页机制。1、页面和物理块 页面:假如内存被划分成大小固定相等的块,且块相对较小,每个进程也被分成同样大小的小块,那么进程中称为页的块可以指定到内存中称为页框的可用块。使用分页技术的内存中为每...原创 2018-10-04 14:41:55 · 487 阅读 · 0 评论 -
实地址模式和保护模式
一、逻辑地址和物理地址物理地址:加载到内存地址寄存器中的地址,内存单元真正的地址 逻辑地址:CPU生成的地址。相当于当前进程数据段的地址(是偏移地址)二、什么是实地址模式1、分段 在程序装入内存时并不是整块装入。因为一个程序包含了很多数据结构,不能一概而论。例如代码是只读的,相对固定的;而数据则会随着程序的变化不断发生变化。因此在程序装入的时候是采用分段的方式,将不同...原创 2019-01-11 14:46:51 · 1596 阅读 · 0 评论 -
Linux内核----进程调度
进程调度是指将哪个进程投入运行,何时运行以及运行多长时间。进程调度程序可看做在可运行态之间分配有限的处理器时间资源的内核子系统。相关概念非抢占式多任务和抢占式多任务:Linux提供了抢占式的多任务,在此模式下由调度程序来决定什么时候停止一个进程的运行,以便其他进程能够得到执行的机会。这个强制的挂起动作叫做抢占。 时间片:实际上就是分配给每个可运行进程的处理器时间段。Linu...原创 2019-01-14 22:10:42 · 293 阅读 · 0 评论 -
如何避免死锁
一、什么是死锁 死锁是指两个或两个以上的进程在执行过程中,因资源争夺而造成的一种相互等待的现象,若不做处理,它们将一直等待下去。例如:进程A和进程B,进程A运行在某一时刻需要进程B所持有的资源,进程B此时运行也需要A进程所持有的资源,因此进程A和进程B都等待对方释放资源,这就产生了死锁。 二、死锁产生的必要条件互斥条件:即某一资源在同一时刻只能被一个进程使用,如果其他进程...原创 2019-02-27 15:00:56 · 178 阅读 · 0 评论 -
僵死进程和孤儿进程的产生和处理
一、僵死进程的产生和处理1、僵死进程的产生 子进程先于父进程结束,这是需要父进程最子进程的pcb进行释放,如果父进程没有对已经结束的子进程进行pcb释放,那么该子进程就一直处于僵死状态,如果父进程运行一段时间也结束了,那还好办,init进程会接收这个僵死的子进程对其pcb进行释放,但是如果父进程一直循环,那么子进程就一直处于僵死状态。2、僵死进程的处理方式(1)将其父进程...原创 2019-02-27 16:43:39 · 552 阅读 · 0 评论 -
线程同步的方法有哪些?
一、线程同步和线程互斥首先我们要清楚什么是线程同步和线程互斥:1、线程同步:线程同步指的是多个线程之间协调同步,按照预定的先后次序进行运行,这种先后次序取决于要完成的特定任务,最基本的场景就是:A线程要完成的任务依赖于B线程的数据。2、线程互斥:线程互斥是指对于线程共享的线程资源,在各个线程访问时具有排它性。当有若干个线程要访问同一共享资源时,任何时刻只允许一个线程进行访问,直到占有资源...原创 2019-02-26 20:41:00 · 6983 阅读 · 0 评论 -
库函数和系统调用的区别
系统调用:操作系统为用户提供了一系列接口,这些接口提供了对硬件设备的操作。举个例子我们用printf想终端打印hello world,程序中调用printf,而printf实际上调用的是write,从而打印信息到终端。库函数:库函数是对系统调用的封装。系统调用作为内核提供给用户的接口,它执行的效率是比较高效和精简的,但有时候我们需要对获取的信息进行一些处理,我们把这些处理过程封装起来提供给程序...原创 2019-03-06 09:03:29 · 556 阅读 · 1 评论 -
用户态切换到内核态的过程
在linux系统中,每个系统调用被赋予一个系统调用号。这样通过这个独一无二的号码就可以关联系统调用。当用户空间执行的进程执行一个系统调用的时候,这个系统调用号就用来告诉内核要执行哪一个系统调用。 内核记录了系统调用表中所有已注册过的系统调用的列表,这个表为每一个有效的系统调用指定了唯一的系统调用号。用户空间程序无法执行内核代码。它们不能直接调用内核中的函数,因为内核驻...原创 2019-03-06 13:56:51 · 2578 阅读 · 0 评论 -
同步异步、阻塞非阻塞
首先我们要清楚同步异步和阻塞非阻塞是两种不同的概念,针对的是不同的层面:同步异步:关注的是消息通信的层面。 阻塞非阻塞:关注的是程序在等待调用结果时的状态。同步异步同步:强调在发出一个请求或功能调用时,主动等待返回结果。在结果没得到前,不能返回或向下执行。异步:强调在发出一个请求或功能调用时,不用等结果,继续向下执行,当有结果时,由被调用方通知主调方,主调方再拿结果示例:情...原创 2019-03-27 14:30:43 · 283 阅读 · 0 评论