计算机基础


1:操作系统原语

操作系统层面上的“原语”(比如 write 之类的系统调用)是不可中断的一组机器指令,对程序员来讲的确是不可分割的最小单位。

但是这写系统调用本身还是用好几句汇编语句组成的(对于 Linux 来说是 C 语言),因此定义“原语”的前提是观察者所处的位置。

比如就在操作系统的这层上,read,wirte,wait这些个系统调用自然就是最“原始”的词汇;


2:进程通信方式

2.1:为什么进程间需要通信? 
1).数据传输 
一个进程需要将它的数据发送给另一个进程; 
2).资源共享 
多个进程之间共享同样的资源; 
3).通知事件 
一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件; 
4).进程控制 
有些进程希望完全控制另一个进程的执行(如Debug进程),该控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变。 
基于以上几个原因,所以就有了进程间通信的概念。

2.2:进程间通信的原理 
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信机制。 
主要的过程如下图所示: 


2.3:进程间通信方式有哪些

  1. 管道(pipe) 
  2. 命名管道(FIFO) 
  3. 消息队列(msg) 
  4. 信号量(sem) 
  5. 共享内存(shm) 

3:补码的运算方法

负数在计算机中是用补码的形式存储的,正数在计算机中是用原码的形式存储的。

正数求原码直接将十进制转二进制即可,负数的补码是在原码的基础上除符号位外其余位取反后+1。

但是用这种方式求负数补码用编程实现不太方便,下面介绍一种用编程实现起来较简便的求负数补码的方法:

1. 求出负数绝对值的原码

2. 从原码的最后一位数码位往前数,当遇到第一个1时停在此位置

3. 将第一个1前面的数码全部求反

比如:(字长为8位)

求-127的补码:

127的原码:  01111111

-127的补码:   10000001

求-80的补码:

80的原码:  01010000

-80的补码:   10110000

求-1的补码:

1的原码:  00000001

-1的补码:   11111111

C语言位运算详解

进制转换:二进制、八进制、十六进制、十进制之间的转换


4:子网掩码

子网掩码(subnet mask)又叫网络掩码地址掩码,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址主机地址两部分。

子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在广域网上。


5:死锁

什么是死锁?
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。如下图所示:

产生死锁的原因?

  1.  竞争资源
  2.  进程间推进顺序非法

死锁产生的4个必要条件?

  1. 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
  2. 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
  4. 环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。

解决死锁的基本方法
预防死锁:打破四个必要条件之一就能有效预防死锁的发生。

  1. 资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
  2. 只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
  3. 可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
  4. 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)

6:闭包

6.1 闭包的含义

具体定义如下:闭包是指有权访问另一个函数作用域中的变量的函数

注意,闭包这个词本身指的是一种函数。而创建这种特殊函数的一种常见方式是在一个函数中创建另一个函数。

 6.2 在C# 中使用闭包(例子选取自《C#函数式程序设计》)

下面我们通过一个简单的例子来理解C#闭包

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(GetClosureFunction()(30));
    }

    static Func<int, int> GetClosureFunction()
    {
        int val = 10;
        Func<int, int> internalAdd = x => x + val;

        Console.WriteLine(internalAdd(10));

        val = 30;
        Console.WriteLine(internalAdd(10));

        return internalAdd;
    }
}

上述代码的执行流程是Main函数调用GetClosureFunction函数,GetClosureFunction返回了委托internalAdd并被立即执行了。

输出结果依次为20、40、60

对应到一开始提出的闭包的概念。这个委托internalAdd就是一个闭包,引用了外部函数GetClosureFunction作用域中的变量val。

注意:internalAdd有没有被当做返回值和闭包的定义无关。就算它没有被返回到外部,它依旧是个闭包。

6.3 闭包特性

优点:减少创建全局变量 减少传递给函数的参数量

缺点:由于闭包携带包含它函数的作用域,因此比其他函数占用的内存更多,泄露内存;


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值