基于互斥量的进程的操作

本文讨论了在企业门户集成中,如何利用互斥量解决多用户并发访问同一业务系统导致的进程管理问题。通过互斥量作为进程标记,实现对不同用户启动的业务系统进程的有效操作和通信,确保系统稳定、安全运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于互斥量的进程的操作

(一)     相关背景.

企业信息化进程的逐步推进,从而要求越来越多的以前单一、独立的业务系统要进行整合和统一管理.比如统一的登录界面等.门户集成技术也应运而生.而在门户集成技术很重要的一个功能是要求应用程序的集成.所谓应用程序集成,应用程序集成指通过数据共享和自动化交易连接不同系统。例如,企业解决方案集成 (EAI) 可连接 HR 系统和工资及会计应用程序。尽管这些应用程序在门户实施中无需彼此直接集成,但由于门户为多个应用程序和内容来源提供单一界面,因此他们可能必须自行与门户进行通信. 与此同时,这也给基于C/S模式架构下的子业务系统(p-2中的业务系统A)带来一些困扰.

(二)     问题提出.

    我们将用一个简单的模型来说明问题是如何出现的.

p-1

p-1中见到的,当我们的用远程桌面或第三方软件访问服务器时.众所周知,通过p-1中的访问,所有程序都将在服务器端执行.那么就出现了一个问题:当很多个用户同时用这种方式登录服务器时,并且同时通过门户访问同一个业务系统(p-2中虚线中的业务系统A),必然会导致服务器端出现很多个业务系统A的进程.

p-2

    然而,当服务器端出现很多个系统A的进程后,就必然导致一个问题:在不同的用户并行访问时,如果门户只提供统一的登录界面.那么当用户通过门户启动了一个业务系统之后,怎么通过门户在去操作它们. 举例说明,p-2中图所示,用户1和用户2分别通过远程桌面的方式访问了服务器,并且在各个用户的本地,当他们同时都调用了系统A,用户1中的企业门户怎么去操作自己的启动的系统A,同理,用户2也一样.也即是我们所面临的问题:在多个同一功能的进程中,如何随需管理进程并进程通信?有人会问,不是可以通过句柄或者子 --父进程去操作它们吗?我们说,这种方法能力有限.比如在这种情况下:门户不止在同一个地方去启动业务系统A,而同时又要要求一个用户下只有一个业务系统A在运行.而这种情况之下,启动的业务系统A的父进程永远是门户进程,句柄亦然.

(三)     解决方法.

问题的出现,给不同的用户并行操作时带来很可怕的后果,使整个操作发生紊乱.仔细分析这种情况后 ,我们提出一种很通用且很简单的操作的方法:用互斥量作为各业务系统进程的标记,那么在不同用户进行操作时,可以根据标记的互斥量进行操作和管理.对互斥量标记的定义:   

自己的标志+processId+SessionID.

其中processId(p-3PID):是业务系统运行后服务器端的进程号,SessionIDp-3中会话ID:不同用户服务器后的会话ID,自己的标志:能够区分业务系统A的标记.而各业务系统自己能得到自己的这些信息,所以只要各用户在启动企业门户时记录下新启动的相关的业务子系统的processIdSessionID在加上识别业务系统A的特别标记.部分代码如下:

 

由此,即可很轻松的在门户和业务系统畅通无阻的进行通信.因此,在企业门户程序中设置一个能操作互斥量的管理程序.这个管理程序的功能是:具有动态判断每个某个用户的企业门户是否有业务系统A在运行,能在特定的情况杀掉进程,以及随时得到业务系统A的进程信息等.

p-3

        p-3所示,我们的管理程序在企业门户 ß---à 业务系统进程这个步骤(红色字体)发挥着作用.如局部流程图p-4所示:

p-4

         关于互斥量企业门户中管理程序的设定的部分核心代码:

        /// <summary>

        /// 检查业务系统A程序是否还正在忙,即是否还在执行任务?

        /// </summary>

        /// <returns>true:再运行 false:未运行</returns>

        private bool CheckIsBusy()

        {

            int iProcID = 0;

            Process[] arrProc = Process.GetProcessesByName("业务系统A");           

            if(arrProc.Length <= 0) //肯定没有运行

            {

                return false;

            }

            foreach (Process pro in arrProc)

            {

                if (Process.GetCurrentProcess().SessionId == pro.SessionId)

                {

                    iProcID = pro.Id;

                    break;

                }

            }

            //设定互斥量

            string strMutex = string.Format("U871CashIsBusy-{0}-{1}", iProcID.ToString,GetCurrentSessionId());

            IntPtr hMutexCash = API32.OpenMutex(0x1f0001, 0, strMutex);

            if (hMutexCash == IntPtr.Zero)  // 当前不忙

            {

                API32.CloseHandle(hMutexCash);

                return false;

            }

            API32.CloseHandle(hMutexCash);

            return true;  //当前忙

        }

        …………

        实践证明,再应用了以上提出的解决方法之后,在特点的条件下,一个用户可以启动一个业务系统,也可以同时启动多个.如果需要启动一个时,当在企业门户另外的地方再启动业务系统A,就通过我们的管理程序返回原来已启动的业务系统A句柄也可以杀掉原来的重新启动.

这样一来,我们就可以随需所用,即使是并行用户登录在各自的门户下启动业务系统A,以及各门户在不同地方去启动业务系统A,都可以动态的监管各子业务系统的情况.使整个系统稳定、安全的运行.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值