操作系统-1

进程
一个具备一定功能的程序在一个数据集上的动态执行的过程。 是操作系统资源分配与调度的基本单元

一般有三部分组成:程序、数据集合以及进程控制块组成

  1. 程序描述进程完成功能,控制进程执行的指令集
  2. 数据集合是程序执行需要的数据与内存空间
  3. 进程控制块PCB包含进程的描述信息与控制信息,是进程存在的唯一标志

线程
线程是任务调度以及执行的基本单位,从属于进程

一个标准的线程由线程ID、程序计数器(PC)以及寄存器和堆栈组成,而进程由代码、数据、内存空间、打开的文件集合和一个或多个线程组成。

线程的并发执行
大部分操作系统任务调用采用时间片轮转的抢占式调度方式。
在一个进程中,当一个线程执行一定时间之后,操作系统内核通过硬件中断处理器,将该线程暂停然后将其寄存器放入内存之中。然后查看线程表决定接下来执行的线程,然后从内存中恢复其寄存器,最后恢复执行,实现多个任务的并发。

协程
基于线程之上,但是比线程更加轻量级的存在,由程序员自己管理的用户空间线程。
本质上一种特殊的函数,实现原理是是通过中断函数运行去执行其他任务,执行完成之后再恢复函数运行。

区别与联系

  1. 协程即不是进程也不是线程,仅仅是一个特殊函数,不是一个维度
  2. 一个进程可以包含多个线程,一个线程可以包含多个协程
  3. 一个线程内的多个协程虽然可以互相切换,但是是串行执行的,无法利用CPU多核能力

进程与线程主要区别:
根本区别: 进程是操作系统资源分配与调度的基本单位,而线程是任务调用与执行的基本单位。
开销方面:每个进程都有独立代码以及数据空间,进程切换开销较大。线程看做是轻量级进程,同一类线程共享代码以及数据空间,每个线程都有自己独立的运行栈以及程序计数器,线程之间切换开销小。
所处环境:操作系统能同时运行多个进程,同一个进程中能同时执行多个线程(时间片轮转)
内存分配:系统在运行时为每个进程分配不同的内存空间,但是对线程来说,除了CPU之外,不再分配内存(所使用的资源来自进程),线程组之前共享资源。
包含关系:线程是进程的一部分,线程也被成为轻量级进程

通信机制
无名管道、有名管道、消息队列、共享内存、信号量。

无名管道: 半双工的,每次都要建立两个管道,用于两个方向的读写 (父子或者兄弟进程)
有名管道:支持无关的进程通信,以一种特殊的设备文件形式存在于文件系统之中。
消息队列: 消息的链接表,存放于内核中,队列由队列ID标识
信号量: 用于实现进程间的互斥与同步,不存储通信数据。
共享内存:两个或者多个进程共享一个给定存储区。一般与信号量一起使用,保持同步。

进程调度

  1. 先来先服务 2. 短作业优先 3. 高优先优先(抢占式与非抢占式) 4. 时间片轮转

并发与并行
并发与并行描述都是多个任务同时运行。但是并发指的是一种处理方式,同时处理多个程序或者任务(时间片轮转)。并行指的是多线程或者多进程同时取得多个任务,然后同时执行这些任务

并发中,**任务可能是并行执行的,也可能是串行的,**与CPU核数量无关,是任务调度和CPU上下文切换达到的效果。

解决大并发的思路是将任务分解为小任务:
然后通过多进程或者多线程的方式执行这些小任务,或者单进程、单线程配合多路复用执行小任务。

高并发(重点)
软件系统在一段时间可以处理大量请求。
并发指的是处理,并行指执行,高并发指的是最终效果

除了基本的并发与并行之外,还需要考虑下面几点:

  1. 集群化部署多台机器,然后添加负载均衡层,将请求均匀给到多态机器。

  2. 数据库最多支持每秒并发二三千连接,对数据库进行分库分表读写分离,主从复制
    分库分表:
    垂直切分

    垂直分库:将关联度低的不同表存储在不同的数据库中
    垂直分表: 基于数据库中的列进行,将一些不常用或者字段长度较大的拆分出去(避免跨页)。

    水平切分
    当垂直切分细粒度不能再小,或者切分后数据量巨大,需要进行水平切分

    库内分表 根据表内数据的逻辑关系,将同一个表的数据按照一定规则分散到库内的多个表中,每个表只包含一部分数据。
    只解决了单一表数据过大问题,但是还是竞争同一个CPU、IO、内存等
    分库分表 将表数据分布到多个库、多个表中。

    问题: 1. 事务一致性 2. 跨节点关联查询join问题

  3. 缓存系统 随着用户量继续增大,不能一直增加数据库服务器,对于写少读多请求,利用缓存系统可以提高并发能力

  4. 引入消息中间件集群
    针对高写入的压力,引入MQ集群,请求异步化处理。分析请求默写是立即写入,有些可以异步化等待几十秒再写入。


所谓的锁,本质上就是内存中的一个整形数,不同数值表示不同状态。
保证锁操作本身的原子性呢? 上锁过程具体表示为:

  1. 读取内存表示锁的变量
  2. 判断锁状态
  3. 如果已经加锁,返回失败
  4. 把锁设置为上锁状态
  5. 返回成功

上面每个步骤对应一条汇编语句,但是多核情况下还是会发生两个锁同时上锁成功。
通过test and set指令,将读取、判断、设置作为一个原子操作。但是多核还是会出现同时获取到锁的情况。

锁内存总线机制——CPU芯片上有HLOCK Pin电位,通过发送指令控制,将其电位拉低,持续到指令执行完毕,将总线锁住。这样同一个总线的其他CPU就不能通过总线来访问内存。

操作系统中的锁:

  1. 信号量 二元信号量 、多元信号量,同一个信号量能被多个线程访问
  2. 互斥量mutex 互斥量只能在同一个线程中获取、释放。
  3. 临界区 临界区锁的获取成为进入临界区,释放称为离开临界区,在本进程所有线程可见。
  4. 读写锁 共享锁 排他锁
  5. 条件变量 通知机制,多个线程设置为等待某个条件变量,另外的线程唤醒条件变量后多个等待的线程就可以继续执行
    与互斥量一起使用,pthread_cond_wait pthread_cond_signal前后都要获取、释放锁。 pthread_cond_wait内部当不满足时会执行解锁,等待条件变量,函数返回之前再加锁。
    这是因为要防止当线程进入cond_wait之前 错过cond_signal。

todo
虚拟内存
io多路复用
程序运行过程 链接库 硬链接软链接
linux相关概念

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值